In [1]:
%pylab inline
import matplotlib.pyplot as plt
Populating the interactive namespace from numpy and matplotlib
In [2]:
# a szinekhez tartozo toroesmutatok:
nred = 1.33; ngreen = 1.335; nblue = 1.34; 

#  'r' ---> red, 'g' ---> green, 'b' ---> blue
nszinek = {"r":nred, "g":ngreen, "b":nblue}   #   dictionary type variable
In [3]:
nszinek['b']
Out[3]:
1.34

Snellius-Descartes-törvény vektorosan

Input: $ \mathbf{i}, \mathbf{N}$ és $n_1, n_2$.

Output (az alábbiak szerint számított): $ \mathbf{r}, \mathbf{t}$

\begin{eqnarray} \mathbf{r} &=& \mathbf{i} \left[\mathbf{1}- 2 \mathbf{N}\circ\mathbf{N} \right] = \mathbf{i} - 2 \left( \mathbf{i} \mathbf{N} \right) \mathbf{N} \nonumber \\ n_2 \mathbf{t} &=& n_1 \mathbf{i} + \mathbf{N}\left(n_1 \cos\vartheta_1 -n_2 \cos\vartheta_2 \right), \,\, \textrm{ahol} \nonumber \\ \cos \vartheta_1 &=& - \mathbf{i N}, \nonumber \\ n_1 \sin \vartheta_1 &=& n_2 \sin \vartheta_2 \nonumber . \end{eqnarray}

In [4]:
def tores(n2,n1,be,normal):
    '''
    Snellius-Descartes-torveny: torestorveny,
    a t vektor szamolasa adott i es N vektorok eseten 
    
    n1: a bal oldalon a toresmutato
    n2: jobb oldalon a toresmutato
    
    '''
    cos1=-dot(be,normal)
    sin1= sqrt(1-cos1**2)
    sin2= n1*sin1/n2
    cos2=sqrt(1-sin2**2)
    
    tv=n1/n2*be+(n1/n2*cos1-cos2)*normal
    return(tv)
In [5]:
def line_circle(r0,be,cent,R,elojel):
    '''
    
    a kor es az egyenes metszespontjat szamolja
    
    r0 =(x0,y0) az egyenes egy pontja
    be: az egyenes iranyvektora (unit vector!)
    cent: a kor kozeppontja
    R: a kor sugara
    
    '''
    
    cr=cent-r0
    l= dot(cr,be)
    
    cr3=array([cr[0],cr[1],0])
    be3=array([be[0],be[1],0])
    rhovec=cross(cr3,be3)
    rho= sqrt(dot(rhovec,rhovec))
    s= sqrt(R**2-rho**2)
    
    lsp=l+elojel*s
    x1=r0[0]+lsp*be[0]
    y1=r0[1]+lsp*be[1]
    rp=array([x1,y1])  #  a kor es az egyenes metszespontja
    
    tmp=elojel*(cent-array([x1,y1]))
    normal=tmp/sqrt(dot(tmp,tmp))
    
    return(rp,normal)
                    
In [6]:
def one_ray_gomb(n2,n1,be,r0,cent,R,elojel):
    
#  be : bejovo sugar iranyvektora (unit vector), 
#  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
#  cent: a kor kozeppontja
#  R; a kor sugara
#  elojel: eldonti, hogy a ket metszespont kozul melyiket valasszuk

  
    (r1,normal) = line_circle(r0,be,cent,R,elojel)
    x1= r1[0]
    y1= r1[1]
    
    tv=tores(n2,n1,be,normal)
    
    tmax=3   # ezzel a megtort sugar hosszat allithatjuk be
    x2=tv[0]*tmax+x1
    y2=tv[1]*tmax+y1
    
    # a lencse alakja
    Np = 100
    #plot([0,0],[R,-R],color='k', lw=1)
    fi=linspace(-pi/2,pi/2,Np)
    plot(cent[0]+R*cos(fi),cent[1]+R*sin(fi), color='k', lw=1)
        
    #  bemeno sugar
    plot([r0[0],x1],[r0[1],y1],color='b',lw=1)
    
    # a kimeno sugar
    plot([x1,x2],[y1,y2],color='r',lw=1);
    #ax.set_xlim(-R*1.05, R*1.05)
    #ax.set_ylim(-R*1.05, R*1.05)
    ax.set_axis_off()
    
In [38]:
def ellipszis_lencse(y, f, n1, n2):
    '''
    A lencse alakjat leiro fuggveny: z(y) egy ellipszis egyenletet elegiti ki
    (megmutatható a Fermat-elv alapján).
    Itt z --> vizszintes tengely, y --> fuggoleges tengely
    n1 a baloldali, n2 a jobboldali tartomany toresmutatoja. 
    A fenysugar balrol jobbra halad. 
    
    n1: a bal oldalon a toresmutato
    n2: jobb oldalon a toresmutato
    
    Input: $y, f, n_1, n_2$. 
    
    Output: z erteke adott y-ra, es a lencse gorbejenek (z,y) pontjaban a 
    a felulet normalvektora, 'nv'. 
    
    '''
    n=n1/n2
    a=f/(1+n)
    b2=f**2*(1-n)/(1+n)
    z=a*(1-sqrt(1-y**2/b2))
    
    normalv=a/b2*y/sqrt(1-y**2/b2)
    nz=1/sqrt(1+normalv**2)
    ny=-normalv/sqrt(1+normalv**2)
    # a z(y) gorbere meroleges normalvektor
    nv=-array([nz,ny]) 
    
    return(z,nv)
    
In [44]:
def one_ray_ellipszis(f,n1,n2,be,x0,y0):
    
    x1, nv = ellipszis_lencse(y0, f, n1, n2)
    tv=tores(n2,n1,be,nv)
    y1=y0
    
    tmax=2   # ezzel a megtort sugar hosszat allithatjuk be
    x2=tv[0]*tmax+x1
    y2=tv[1]*tmax+y1
    
    plot([x0,x1],[y0,y1],color='b',lw=1)
    plot([x1,x2],[y1,y2],color='r',lw=1);
    ax.set_axis_off()

        

Szférikus aberráció (spherical aberration)

Sugármenetek rajzolása féldomború (sík-gömb) lencsén keresztül

In [45]:
n1,n2 = (3/2,1)

R=1
cent=array([0,0])  #  cent: a kor kozeppontja
elojel=1

r0=array([-1.5*R,0.25*R]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= 15*pi/180  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

figsize(10,10)   
ax=subplot(aspect='equal')


one_ray_gomb(n2,n1,be,r0,cent,R,elojel)
In [46]:
n1,n2 = (3/2,1)
Np=20

R=1
cent=array([0,0])  #  cent: a kor kozeppontja
elojel=1

r0=array([-1.5*R,0.5*R]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= 0*pi/180  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

figsize(10,10)   
ax=subplot(aspect='equal')

x0=-1.*R
y0list=linspace(-n2/n1,n2/n1,Np)
#y0list=linspace(-R,R,Np)

[one_ray_gomb(n2,n1,be,array([x0,y0]),cent,R,elojel) for y0 in y0list];
In [47]:
n1,n2 = (3/2,1)
Np=20

R=1
cent=array([0,0])  #  cent: a kor kozeppontja
elojel=1

r0=array([-1.5*R,0.5*R]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= 30*pi/180  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

figsize(10,10)   
ax=subplot(aspect='equal')

x0=-0.5*R
#y0lit=linspace(-n2/n1,n2/n1,Np)
y0list=linspace(-1.0*R,0.4*R,Np)
#y0list=linspace(-R,R,Np)

[one_ray_gomb(n2,n1,be,array([x0,y0]),cent,R,elojel) for y0 in y0list];

Tökéletes lencse, nincs szférikus aberráció

A lencse alakja ellipszis (megmutatható a Fermat-elv alapján). A görbe egyenletét a $z(y)$ függvénnyel adjuk meg az alábbiak szerint (itt $z$ a viszintes, $y$ a függőleges tengely).

Input: $f, n_1, n_2$.

A lencse görbéjének egyenlete ellipszis:

$\frac{{\left(z-a\right)}^2}{a^2}+\frac{y^2}{b^2} =1$, ahol

$a = f \frac{1}{n+1}$,

$b^2 = f^2 \frac{1-n}{1+n}$, Ha n=n1/n2 > 1, akkor b/2 < 0 -- hiperbola

$n = n_1/n_2$.

Innen $z(y)$:

$z(y) = a \left(1-\sqrt{1-\frac{y^2}{a^2}}\right)$.

Hiperbola alakú lencse, $n_1 > n_2$

In [52]:
Nplencse=100
n1,n2 = (3/2,1)
f=1

# lencse alakjahoz
ym=0.8
y=linspace(-ym,ym,Nplencse)
z,nv = ellipszis_lencse(y, f, n1, n2)

figsize(10,10)
ax=subplot(aspect='equal')

plot(z,y,color='k'); #  a lencse alakja

Np=16  # bejovo sugarak szama
be=array([1,0])
y0list=linspace(-ym,ym,Np)
#y0list=linspace(-R,R,Np)

[one_ray_ellipszis(f,n1,n2,be,-f,y0) for y0 in y0list];

Ellipszis alakú lencse, $n_1 < n_2$

In [51]:
Nplencse=100
n1,n2 = (1,3/2)
f=1

# lencse alakjahoz
ym=0.4
y=linspace(-ym,ym,Nplencse)
z,nv = ellipszis_lencse(y, f, n1, n2)

figsize(10,10)
ax=subplot(aspect='equal')

plot(z,y,color='k'); #  a lencse alakja

Np=10  # bejovo sugarak szama
be=array([1,0])
y0list=linspace(-ym,ym,Np)
#y0list=linspace(-R,R,Np)

[one_ray_ellipszis(f,n1,n2,be,-f,y0) for y0 in y0list];